package com.njts.programming;

import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

/**
 * @author David GE
 * Date  2025/11/17
 * 软件开发问题 -->结构化方法分析(关注系统的数据流)
 * 抽奖系统
 * 双色球彩票，由前区6个红球号码和后区1个蓝球号码组成。前区6个红球号码是从
 * 1~33中选择；后区蓝球号码是从1~16中选择；而且前区6个红球号码是不能重复
 * 的。编写程序，能够让用户录入一注双色球彩票；也可以随机产生一注双色球彩票

 * 6个红球+1个蓝球，奖金1000万
 * 6个红球+0个蓝球，奖金500万
 * 5个红球+1个蓝球，奖金3000块
 * 5个红球+0个蓝球，或者4个红球+1个蓝球，奖金200块
 * 4个红球+0个蓝球，或者3个红球+1个蓝球，奖金10块
 * 小于3个红球+1个蓝球，奖金5块
 */
public class Lottery {
    public static void main(String[] args) {
        // 1 数据初始化
        Scanner scanner = new Scanner(System.in);
        int[] redBall = new int[6];
        int blueBall =0;
        int[] redNumbers = new int[33];
        for (int i = 0; i < redNumbers.length; i++) {
            redNumbers[i]=i+1;

        }
        int[] blueNumbers = new int[16];
        for (int i = 0; i < blueNumbers.length; i++) {
           blueNumbers[i]=i+1;

        }

        //2 设置用户提示
        System.out.println("请输入您是否需要手动选号:Y/N");
        String choice = scanner.next();
        if ("Y".equals(choice.toUpperCase())){
            // 手动选号
            blueBall = chooseNumber(redNumbers, blueNumbers, redBall);

        }else{
            // 随机抽奖
            blueBall = randomNumber(redNumbers, blueNumbers, redBall);
        }


        // 3 生成中奖号码
        int[] results = gernerateNumbers();
        //4 比对用户结果
        System.out.println("此次中奖号码为"+ Arrays.toString(results));
        System.out.println("您的投注结果为"+ Arrays.toString(redBall).replace("[","").replace("]",",")+blueBall);

        // 5 输出用户得奖情况
        printResult(results,redBall,blueBall);
    }


    /**
     *
     * @param redNumbers 红球的备选号码
     * @param blueNumbers 篮球的备选号码
     * @param redBall 选择的红球号码
     * @return 选择的蓝球号码
     */
    public static int chooseNumber(int[] redNumbers,int[] blueNumbers,int [] redBall) {
        Scanner scanner = new Scanner(System.in);
        for (int i = 0; i < redBall.length; i++) {
            System.out.println("请输入您选择的第"+(i+1)+"个红球号码(1-33)");
            int num =scanner.nextInt();
            // 为了防止用户输入范围以外的红球号码,给予提示,判断
            while (num>33 || num<1){
                System.out.println("输入的号码不在红球范围,请重新输入");
                num=scanner.nextInt();
            }
            // 检查readBall中是否有重复的号码
            boolean isExist = checkNumber(num,redBall);
            while (isExist){
                System.out.println("输入的号码重复了,请重新输入");
                num=scanner.nextInt();
                isExist = checkNumber(num, redBall);
            }
            redBall[i]=num;

        }
        System.out.println("请输入蓝色球号码(1-16)");
        int blueBall = scanner.nextInt();
        while (blueBall<1 || blueBall>16){
            System.out.println("输入的号码不在蓝球范围,请重新输入");
            blueBall=scanner.nextInt();
        }
        return blueBall;
    }



    /**
     *
     * @param redNumbers 红球的备选号码
     * @param blueNumbers 篮球的备选号码
     * @param redBall 选择的红球号码
     * @return 选择的蓝球号码
     */
    private static int randomNumber(int[] redNumbers, int[] blueNumbers, int[] redBall) {
        Random random = new Random();
        for (int i = 0; i < redBall.length; i++) {
            // 默认随机数从0开始,如何产生1-33? 区间平移
            int num=random.nextInt(32)+1;//[1,n+1) ->[m,n+m)
            // 检查readBall中是否有重复的号码
            boolean isExist = checkNumber(num,redBall);
            while (isExist){
                num=random.nextInt(32)+1;//[1,n+1) ->[m,n+m)
                isExist = checkNumber(num, redBall);
            }
            redBall[i]=num;

        }


        int blueBall = random.nextInt(15)+1;
        return blueBall;
    }

    private static boolean checkNumber(int num, int[] redBall) {
        for (int i = 0; i < redBall.length; i++) {
            if (redBall[i]==num){
                return true;
            }
        }
        return false;
    }


    public static int[] gernerateNumbers() {
        Random random = new Random();

        // 1 生成红球
        int[] results = new int[7];

        for (int i = 0; i < 6; i++) {
            int num=random.nextInt(32)+1;//[1,n+1) ->[m,n+m)
            // 检查readBall中是否有重复的号码
            boolean isExist = checkNumber(num,results);
            while (isExist){
                num=random.nextInt(32)+1;//[1,n+1) ->[m,n+m)
                isExist = checkNumber(num, results);
            }
            results[i]=num;
        }
        // 2 生成蓝球
        int blueBall = random.nextInt(15)+1;
        results[results.length-1]=blueBall;
        return results;
    }



    /**
     * 输出结果
     * @param results 中奖号码
     * @param redBall 红球
     * @param blueBall 蓝球
     */
    public static  void printResult(int[] results,int[] redBall,int blueBall){
        int redNum=0;
        int blueNum=0;
        int[] redBalls = Arrays.copyOf(results, 6);
        for (int i = 0; i < redBall.length; i++) {
            if (checkNumber(redBall[i],redBalls)){
                redNum++;
            }
        }
        if (results[results.length-1]==blueBall){
            blueNum++;
        }
        // 输出
        /*
         * * 6个红球+1个蓝球，奖金1000万
         * 6个红球+0个蓝球，奖金500万
         * 5个红球+1个蓝球，奖金3000块
         * 5个红球+0个蓝球，或者4个红球+1个蓝球，奖金200块
         * 4个红球+0个蓝球，或者3个红球+1个蓝球，奖金10块
         * 小于3个红球+1个蓝球，奖金5块
         * */
        if (redNum==6 && blueNum==1){
            System.out.println("奖金1000万");
        }else  if (redNum==6 && blueNum==0){
            System.out.println("奖金500万");
        }else  if (redNum==5 && blueNum==1){
            System.out.println("奖金3000");
        }else  if ((redNum==5 && blueNum==0) || (redNum==4 && blueNum==1)){
            System.out.println("奖金200");
        }else  if (redNum==4 && blueNum==0 || ((redNum==3 && blueNum==1))){
            System.out.println("奖金10");
        }else {
            System.out.println("感谢您为福利事业做出微薄的贡献");
        }

    }


}
